package kotlinquanweizhinan.chapt10.`while`

import javafx.scene.control.Slider
import java.io.File
import kotlin.math.roundToInt

/*
* Trvern 英['tævən]美['tævərn] n.酒馆;客栈
* */
class Trvern {
}

const val TRVERN_NAME ="Taernyl's Folly"
var playerGold = 10
var playerSilver = 10
//val patronList = listOf("Eli","Mordoc","Sophie") //三个顾客列表
val patronList = mutableListOf("Eli","Mordoc","Sophie")

val lastName = listOf("Ironfoot","Fernsworth","Baggins")
val uniquePatrons = mutableSetOf<String>()    //空的可变Set集合
val menuList = File("data/tavern-menu-items1.txt")
    .readText()
    .split("\n")
fun main() {
    //为了去除重复值，我们把新产生的姓名都添加到Set集合里。重复的值都会被去除，只剩下唯一值
    //定义一个空的可变Set集合，然后把随机产生的顾客姓名添加进去
    (0..9).forEach{
        val first = patronList.shuffled().first()
        val last = lastName.shuffled().first()
        val name = "$first $last"
        //println(name)
        uniquePatrons +=name
    }
    println(uniquePatrons)


    //当某个条件满足时，就执行循环体里的代码
    //我们的需求是不多不少正好下10个单。为了完成任务，我们使用一个var变量记录已下单次数，用一个while循环不断下单，直到满10个为止
    var orderCount = 0
    while(orderCount <=9){
        placeOrder(uniquePatrons.shuffled().first(), menuList.shuffled().first())
        orderCount++
    }


}

/**
 * @param patronName 顾客名字
 * @param menuData 洒水单数据使用字符串表示，用逗号分隔的饮料类型、饮料名和价格(金币)以这样的格式存储
 *
 * shandy,Ddragon's Breath,5.91
 * 香迪,
 */
private fun placeOrder(patronName:String,menuData:String){
    val indexOfApostrophe = TRVERN_NAME.indexOf('\'')
    val tavernMaster = TRVERN_NAME.substring(0 until indexOfApostrophe)
    //println("Madrigal speaks with $tavernMaster about their order.") //adrigal 与 Taernyl 谈论他们的订单。
    println("$patronName speaks with $tavernMaster about their order.") //adrigal 与 Taernyl 谈论他们的订单。

    /**
     * split函数返回的是一个List集合数据，而List集合又支持一种叫解构(destructuring)的语法特性
     * (这个Kotlin特性允许你在一个表达式里给多个变量赋值)
     * 解构常用来简化变量的赋值。只要是集合结果，就可以使用解构赋值。除了List集合，其
     * 他支持解构语法的数据类型有Maps、Pairs以及数据类_
     */
    val (type,name,price) = menuData.split(',')
    //val message = "Madrigal buys a $name ($type) for $price."
    val message = "$patronName buys a $name($type) for $price"
    println(message)


    //performPurchase(price.toDouble())

    val phrase = if(name == "Dragon's Breath"){
        "$patronName exclaims ${toDragSpeak(("Ah,delicious $name"))}"
    }else
        "$patronName says:Thanks for the $name"

    println(phrase)
}

//说龙的语言
private fun toDragSpeak(phrase:String)=
    phrase.replace(Regex("[aeiou]")){
        when(it.value){
            "a" -> "4"
            "e" -> "3"
            "i" -> "1"
            "o" -> "0"
            "u" -> "|_|"
            else -> it.value
        }
    }

//从总资金数里减去购买总价
fun performPurchase(price:Double){
    displayBalance()
    val totalPurse = playerGold + (playerSilver / 100.0)
    println("Total Purse $totalPurse")
    println("PUrchasing item for $price")

    val remainngBalance = totalPurse - price

    //Double类型格式化：remainngBalance=4.1899999999999995
    println("Remainng Balance ${"%.2f".format(remainngBalance)}") //4.19

    /**
     * 这里使用了Double类型的两个转换函数。调用toInt函数转换Double类型数据的结果就是，它小数部分的值会丢掉。
     * 这种现象叫精度损失
     */
    val remainingGold = remainngBalance.toInt()

    /**
     * 这里，我们使用了取模运行符%(又叫取余运算符)，也就是求两个数相除的余数。%1的效果就是
     * 拿掉整数部分值（这部分能被1整除），剩下小数部分值。最后，用余数乘以100，然后针对
     * 对 18.99999999999995调用roundToInt函数。该函数四舍五入，得到最近似的整数。所
     * 以剩余的银币数就是19.
     */
    val remainingSilver = (remainngBalance % 1 *100).roundToInt()
    playerGold = remainingGold
    playerSilver = remainingSilver
    displayBalance()
}
private fun displayBalance(){
    println("Player's purse balance:Golod:$playerGold,Silver:$playerSilver")
}